home *** CD-ROM | disk | FTP | other *** search
/ Nebula 1 / Nebula One.iso / Utilities / Unix / skey / src / put.c < prev    next >
C/C++ Source or Header  |  1993-11-08  |  25KB  |  2,321 lines

  1. /* S/KEY v1.1b (put.c)
  2.  *
  3.  * Authors:
  4.  *          Neil M. Haller <nmh@thumper.bellcore.com>
  5.  *          Philip R. Karn <karn@chicago.qualcomm.com>
  6.  *          John S. Walden <jsw@thumper.bellcore.com>
  7.  *          Scott Chasin <chasin@crimelab.com>
  8.  *
  9.  * Dictionary lookup and extraction.
  10.  */
  11.  
  12. #include <stdio.h>
  13. #include <string.h>
  14. #include <assert.h>
  15. #include <ctype.h>
  16. #include "skey.h"
  17.  
  18. static unsigned long extract __ARGS ((char *s, int start, int length));
  19. static void standard __ARGS ((char *word));
  20. static void insert __ARGS ((char *s, int x, int start, int length));
  21. static int wsrch __ARGS ((char *w, int low, int high));
  22.  
  23. /* Dictionary for integer-word translations */
  24. char Wp[2048][4] = {
  25.   "A",
  26.   "ABE",
  27.   "ACE",
  28.   "ACT",
  29.   "AD",
  30.   "ADA",
  31.   "ADD",
  32.   "AGO",
  33.   "AID",
  34.   "AIM",
  35.   "AIR",
  36.   "ALL",
  37.   "ALP",
  38.   "AM",
  39.   "AMY",
  40.   "AN",
  41.   "ANA",
  42.   "AND",
  43.   "ANN",
  44.   "ANT",
  45.   "ANY",
  46.   "APE",
  47.   "APS",
  48.   "APT",
  49.   "ARC",
  50.   "ARE",
  51.   "ARK",
  52.   "ARM",
  53.   "ART",
  54.   "AS",
  55.   "ASH",
  56.   "ASK",
  57.   "AT",
  58.   "ATE",
  59.   "AUG",
  60.   "AUK",
  61.   "AVE",
  62.   "AWE",
  63.   "AWK",
  64.   "AWL",
  65.   "AWN",
  66.   "AX",
  67.   "AYE",
  68.   "BAD",
  69.   "BAG",
  70.   "BAH",
  71.   "BAM",
  72.   "BAN",
  73.   "BAR",
  74.   "BAT",
  75.   "BAY",
  76.   "BE",
  77.   "BED",
  78.   "BEE",
  79.   "BEG",
  80.   "BEN",
  81.   "BET",
  82.   "BEY",
  83.   "BIB",
  84.   "BID",
  85.   "BIG",
  86.   "BIN",
  87.   "BIT",
  88.   "BOB",
  89.   "BOG",
  90.   "BON",
  91.   "BOO",
  92.   "BOP",
  93.   "BOW",
  94.   "BOY",
  95.   "BUB",
  96.   "BUD",
  97.   "BUG",
  98.   "BUM",
  99.   "BUN",
  100.   "BUS",
  101.   "BUT",
  102.   "BUY",
  103.   "BY",
  104.   "BYE",
  105.   "CAB",
  106.   "CAL",
  107.   "CAM",
  108.   "CAN",
  109.   "CAP",
  110.   "CAR",
  111.   "CAT",
  112.   "CAW",
  113.   "COD",
  114.   "COG",
  115.   "COL",
  116.   "CON",
  117.   "COO",
  118.   "COP",
  119.   "COT",
  120.   "COW",
  121.   "COY",
  122.   "CRY",
  123.   "CUB",
  124.   "CUE",
  125.   "CUP",
  126.   "CUR",
  127.   "CUT",
  128.   "DAB",
  129.   "DAD",
  130.   "DAM",
  131.   "DAN",
  132.   "DAR",
  133.   "DAY",
  134.   "DEE",
  135.   "DEL",
  136.   "DEN",
  137.   "DES",
  138.   "DEW",
  139.   "DID",
  140.   "DIE",
  141.   "DIG",
  142.   "DIN",
  143.   "DIP",
  144.   "DO",
  145.   "DOE",
  146.   "DOG",
  147.   "DON",
  148.   "DOT",
  149.   "DOW",
  150.   "DRY",
  151.   "DUB",
  152.   "DUD",
  153.   "DUE",
  154.   "DUG",
  155.   "DUN",
  156.   "EAR",
  157.   "EAT",
  158.   "ED",
  159.   "EEL",
  160.   "EGG",
  161.   "EGO",
  162.   "ELI",
  163.   "ELK",
  164.   "ELM",
  165.   "ELY",
  166.   "EM",
  167.   "END",
  168.   "EST",
  169.   "ETC",
  170.   "EVA",
  171.   "EVE",
  172.   "EWE",
  173.   "EYE",
  174.   "FAD",
  175.   "FAN",
  176.   "FAR",
  177.   "FAT",
  178.   "FAY",
  179.   "FED",
  180.   "FEE",
  181.   "FEW",
  182.   "FIB",
  183.   "FIG",
  184.   "FIN",
  185.   "FIR",
  186.   "FIT",
  187.   "FLO",
  188.   "FLY",
  189.   "FOE",
  190.   "FOG",
  191.   "FOR",
  192.   "FRY",
  193.   "FUM",
  194.   "FUN",
  195.   "FUR",
  196.   "GAB",
  197.   "GAD",
  198.   "GAG",
  199.   "GAL",
  200.   "GAM",
  201.   "GAP",
  202.   "GAS",
  203.   "GAY",
  204.   "GEE",
  205.   "GEL",
  206.   "GEM",
  207.   "GET",
  208.   "GIG",
  209.   "GIL",
  210.   "GIN",
  211.   "GO",
  212.   "GOT",
  213.   "GUM",
  214.   "GUN",
  215.   "GUS",
  216.   "GUT",
  217.   "GUY",
  218.   "GYM",
  219.   "GYP",
  220.   "HA",
  221.   "HAD",
  222.   "HAL",
  223.   "HAM",
  224.   "HAN",
  225.   "HAP",
  226.   "HAS",
  227.   "HAT",
  228.   "HAW",
  229.   "HAY",
  230.   "HE",
  231.   "HEM",
  232.   "HEN",
  233.   "HER",
  234.   "HEW",
  235.   "HEY",
  236.   "HI",
  237.   "HID",
  238.   "HIM",
  239.   "HIP",
  240.   "HIS",
  241.   "HIT",
  242.   "HO",
  243.   "HOB",
  244.   "HOC",
  245.   "HOE",
  246.   "HOG",
  247.   "HOP",
  248.   "HOT",
  249.   "HOW",
  250.   "HUB",
  251.   "HUE",
  252.   "HUG",
  253.   "HUH",
  254.   "HUM",
  255.   "HUT",
  256.   "I",
  257.   "ICY",
  258.   "IDA",
  259.   "IF",
  260.   "IKE",
  261.   "ILL",
  262.   "INK",
  263.   "INN",
  264.   "IO",
  265.   "ION",
  266.   "IQ",
  267.   "IRA",
  268.   "IRE",
  269.   "IRK",
  270.   "IS",
  271.   "IT",
  272.   "ITS",
  273.   "IVY",
  274.   "JAB",
  275.   "JAG",
  276.   "JAM",
  277.   "JAN",
  278.   "JAR",
  279.   "JAW",
  280.   "JAY",
  281.   "JET",
  282.   "JIG",
  283.   "JIM",
  284.   "JO",
  285.   "JOB",
  286.   "JOE",
  287.   "JOG",
  288.   "JOT",
  289.   "JOY",
  290.   "JUG",
  291.   "JUT",
  292.   "KAY",
  293.   "KEG",
  294.   "KEN",
  295.   "KEY",
  296.   "KID",
  297.   "KIM",
  298.   "KIN",
  299.   "KIT",
  300.   "LA",
  301.   "LAB",
  302.   "LAC",
  303.   "LAD",
  304.   "LAG",
  305.   "LAM",
  306.   "LAP",
  307.   "LAW",
  308.   "LAY",
  309.   "LEA",
  310.   "LED",
  311.   "LEE",
  312.   "LEG",
  313.   "LEN",
  314.   "LEO",
  315.   "LET",
  316.   "LEW",
  317.   "LID",
  318.   "LIE",
  319.   "LIN",
  320.   "LIP",
  321.   "LIT",
  322.   "LO",
  323.   "LOB",
  324.   "LOG",
  325.   "LOP",
  326.   "LOS",
  327.   "LOT",
  328.   "LOU",
  329.   "LOW",
  330.   "LOY",
  331.   "LUG",
  332.   "LYE",
  333.   "MA",
  334.   "MAC",
  335.   "MAD",
  336.   "MAE",
  337.   "MAN",
  338.   "MAO",
  339.   "MAP",
  340.   "MAT",
  341.   "MAW",
  342.   "MAY",
  343.   "ME",
  344.   "MEG",
  345.   "MEL",
  346.   "MEN",
  347.   "MET",
  348.   "MEW",
  349.   "MID",
  350.   "MIN",
  351.   "MIT",
  352.   "MOB",
  353.   "MOD",
  354.   "MOE",
  355.   "MOO",
  356.   "MOP",
  357.   "MOS",
  358.   "MOT",
  359.   "MOW",
  360.   "MUD",
  361.   "MUG",
  362.   "MUM",
  363.   "MY",
  364.   "NAB",
  365.   "NAG",
  366.   "NAN",
  367.   "NAP",
  368.   "NAT",
  369.   "NAY",
  370.   "NE",
  371.   "NED",
  372.   "NEE",
  373.   "NET",
  374.   "NEW",
  375.   "NIB",
  376.   "NIL",
  377.   "NIP",
  378.   "NIT",
  379.   "NO",
  380.   "NOB",
  381.   "NOD",
  382.   "NON",
  383.   "NOR",
  384.   "NOT",
  385.   "NOV",
  386.   "NOW",
  387.   "NU",
  388.   "NUN",
  389.   "NUT",
  390.   "O",
  391.   "OAF",
  392.   "OAK",
  393.   "OAR",
  394.   "OAT",
  395.   "ODD",
  396.   "ODE",
  397.   "OF",
  398.   "OFF",
  399.   "OFT",
  400.   "OH",
  401.   "OIL",
  402.   "OK",
  403.   "OLD",
  404.   "ON",
  405.   "ONE",
  406.   "OR",
  407.   "ORB",
  408.   "ORE",
  409.   "ORR",
  410.   "OS",
  411.   "OTT",
  412.   "OUR",
  413.   "OUT",
  414.   "OVA",
  415.   "OW",
  416.   "OWE",
  417.   "OWL",
  418.   "OWN",
  419.   "OX",
  420.   "PA",
  421.   "PAD",
  422.   "PAL",
  423.   "PAM",
  424.   "PAN",
  425.   "PAP",
  426.   "PAR",
  427.   "PAT",
  428.   "PAW",
  429.   "PAY",
  430.   "PEA",
  431.   "PEG",
  432.   "PEN",
  433.   "PEP",
  434.   "PER",
  435.   "PET",
  436.   "PEW",
  437.   "PHI",
  438.   "PI",
  439.   "PIE",
  440.   "PIN",
  441.   "PIT",
  442.   "PLY",
  443.   "PO",
  444.   "POD",
  445.   "POE",
  446.   "POP",
  447.   "POT",
  448.   "POW",
  449.   "PRO",
  450.   "PRY",
  451.   "PUB",
  452.   "PUG",
  453.   "PUN",
  454.   "PUP",
  455.   "PUT",
  456.   "QUO",
  457.   "RAG",
  458.   "RAM",
  459.   "RAN",
  460.   "RAP",
  461.   "RAT",
  462.   "RAW",
  463.   "RAY",
  464.   "REB",
  465.   "RED",
  466.   "REP",
  467.   "RET",
  468.   "RIB",
  469.   "RID",
  470.   "RIG",
  471.   "RIM",
  472.   "RIO",
  473.   "RIP",
  474.   "ROB",
  475.   "ROD",
  476.   "ROE",
  477.   "RON",
  478.   "ROT",
  479.   "ROW",
  480.   "ROY",
  481.   "RUB",
  482.   "RUE",
  483.   "RUG",
  484.   "RUM",
  485.   "RUN",
  486.   "RYE",
  487.   "SAC",
  488.   "SAD",
  489.   "SAG",
  490.   "SAL",
  491.   "SAM",
  492.   "SAN",
  493.   "SAP",
  494.   "SAT",
  495.   "SAW",
  496.   "SAY",
  497.   "SEA",
  498.   "SEC",
  499.   "SEE",
  500.   "SEN",
  501.   "SET",
  502.   "SEW",
  503.   "SHE",
  504.   "SHY",
  505.   "SIN",
  506.   "SIP",
  507.   "SIR",
  508.   "SIS",
  509.   "SIT",
  510.   "SKI",
  511.   "SKY",
  512.   "SLY",
  513.   "SO",
  514.   "SOB",
  515.   "SOD",
  516.   "SON",
  517.   "SOP",
  518.   "SOW",
  519.   "SOY",
  520.   "SPA",
  521.   "SPY",
  522.   "SUB",
  523.   "SUD",
  524.   "SUE",
  525.   "SUM",
  526.   "SUN",
  527.   "SUP",
  528.   "TAB",
  529.   "TAD",
  530.   "TAG",
  531.   "TAN",
  532.   "TAP",
  533.   "TAR",
  534.   "TEA",
  535.   "TED",
  536.   "TEE",
  537.   "TEN",
  538.   "THE",
  539.   "THY",
  540.   "TIC",
  541.   "TIE",
  542.   "TIM",
  543.   "TIN",
  544.   "TIP",
  545.   "TO",
  546.   "TOE",
  547.   "TOG",
  548.   "TOM",
  549.   "TON",
  550.   "TOO",
  551.   "TOP",
  552.   "TOW",
  553.   "TOY",
  554.   "TRY",
  555.   "TUB",
  556.   "TUG",
  557.   "TUM",
  558.   "TUN",
  559.   "TWO",
  560.   "UN",
  561.   "UP",
  562.   "US",
  563.   "USE",
  564.   "VAN",
  565.   "VAT",
  566.   "VET",
  567.   "VIE",
  568.   "WAD",
  569.   "WAG",
  570.   "WAR",
  571.   "WAS",
  572.   "WAY",
  573.   "WE",
  574.   "WEB",
  575.   "WED",
  576.   "WEE",
  577.   "WET",
  578.   "WHO",
  579.   "WHY",
  580.   "WIN",
  581.   "WIT",
  582.   "WOK",
  583.   "WON",
  584.   "WOO",
  585.   "WOW",
  586.   "WRY",
  587.   "WU",
  588.   "YAM",
  589.   "YAP",
  590.   "YAW",
  591.   "YE",
  592.   "YEA",
  593.   "YES",
  594.   "YET",
  595.   "YOU",
  596.   "ABED",
  597.   "ABEL",
  598.   "ABET",
  599.   "ABLE",
  600.   "ABUT",
  601.   "ACHE",
  602.   "ACID",
  603.   "ACME",
  604.   "ACRE",
  605.   "ACTA",
  606.   "ACTS",
  607.   "ADAM",
  608.   "ADDS",
  609.   "ADEN",
  610.   "AFAR",
  611.   "AFRO",
  612.   "AGEE",
  613.   "AHEM",
  614.   "AHOY",
  615.   "AIDA",
  616.   "AIDE",
  617.   "AIDS",
  618.   "AIRY",
  619.   "AJAR",
  620.   "AKIN",
  621.   "ALAN",
  622.   "ALEC",
  623.   "ALGA",
  624.   "ALIA",
  625.   "ALLY",
  626.   "ALMA",
  627.   "ALOE",
  628.   "ALSO",
  629.   "ALTO",
  630.   "ALUM",
  631.   "ALVA",
  632.   "AMEN",
  633.   "AMES",
  634.   "AMID",
  635.   "AMMO",
  636.   "AMOK",
  637.   "AMOS",
  638.   "AMRA",
  639.   "ANDY",
  640.   "ANEW",
  641.   "ANNA",
  642.   "ANNE",
  643.   "ANTE",
  644.   "ANTI",
  645.   "AQUA",
  646.   "ARAB",
  647.   "ARCH",
  648.   "AREA",
  649.   "ARGO",
  650.   "ARID",
  651.   "ARMY",
  652.   "ARTS",
  653.   "ARTY",
  654.   "ASIA",
  655.   "ASKS",
  656.   "ATOM",
  657.   "AUNT",
  658.   "AURA",
  659.   "AUTO",
  660.   "AVER",
  661.   "AVID",
  662.   "AVIS",
  663.   "AVON",
  664.   "AVOW",
  665.   "AWAY",
  666.   "AWRY",
  667.   "BABE",
  668.   "BABY",
  669.   "BACH",
  670.   "BACK",
  671.   "BADE",
  672.   "BAIL",
  673.   "BAIT",
  674.   "BAKE",
  675.   "BALD",
  676.   "BALE",
  677.   "BALI",
  678.   "BALK",
  679.   "BALL",
  680.   "BALM",
  681.   "BAND",
  682.   "BANE",
  683.   "BANG",
  684.   "BANK",
  685.   "BARB",
  686.   "BARD",
  687.   "BARE",
  688.   "BARK",
  689.   "BARN",
  690.   "BARR",
  691.   "BASE",
  692.   "BASH",
  693.   "BASK",
  694.   "BASS",
  695.   "BATE",
  696.   "BATH",
  697.   "BAWD",
  698.   "BAWL",
  699.   "BEAD",
  700.   "BEAK",
  701.   "BEAM",
  702.   "BEAN",
  703.   "BEAR",
  704.   "BEAT",
  705.   "BEAU",
  706.   "BECK",
  707.   "BEEF",
  708.   "BEEN",
  709.   "BEER",
  710.   "BEET",
  711.   "BELA",
  712.   "BELL",
  713.   "BELT",
  714.   "BEND",
  715.   "BENT",
  716.   "BERG",
  717.   "BERN",
  718.   "BERT",
  719.   "BESS",
  720.   "BEST",
  721.   "BETA",
  722.   "BETH",
  723.   "BHOY",
  724.   "BIAS",
  725.   "BIDE",
  726.   "BIEN",
  727.   "BILE",
  728.   "BILK",
  729.   "BILL",
  730.   "BIND",
  731.   "BING",
  732.   "BIRD",
  733.   "BITE",
  734.   "BITS",
  735.   "BLAB",
  736.   "BLAT",
  737.   "BLED",
  738.   "BLEW",
  739.   "BLOB",
  740.   "BLOC",
  741.   "BLOT",
  742.   "BLOW",
  743.   "BLUE",
  744.   "BLUM",
  745.   "BLUR",
  746.   "BOAR",
  747.   "BOAT",
  748.   "BOCA",
  749.   "BOCK",
  750.   "BODE",
  751.   "BODY",
  752.   "BOGY",
  753.   "BOHR",
  754.   "BOIL",
  755.   "BOLD",
  756.   "BOLO",
  757.   "BOLT",
  758.   "BOMB",
  759.   "BONA",
  760.   "BOND",
  761.   "BONE",
  762.   "BONG",
  763.   "BONN",
  764.   "BONY",
  765.   "BOOK",
  766.   "BOOM",
  767.   "BOON",
  768.   "BOOT",
  769.   "BORE",
  770.   "BORG",
  771.   "BORN",
  772.   "BOSE",
  773.   "BOSS",
  774.   "BOTH",
  775.   "BOUT",
  776.   "BOWL",
  777.   "BOYD",
  778.   "BRAD",
  779.   "BRAE",
  780.   "BRAG",
  781.   "BRAN",
  782.   "BRAY",
  783.   "BRED",
  784.   "BREW",
  785.   "BRIG",
  786.   "BRIM",
  787.   "BROW",
  788.   "BUCK",
  789.   "BUDD",
  790.   "BUFF",
  791.   "BULB",
  792.   "BULK",
  793.   "BULL",
  794.   "BUNK",
  795.   "BUNT",
  796.   "BUOY",
  797.   "BURG",
  798.   "BURL",
  799.   "BURN",
  800.   "BURR",
  801.   "BURT",
  802.   "BURY",
  803.   "BUSH",
  804.   "BUSS",
  805.   "BUST",
  806.   "BUSY",
  807.   "BYTE",
  808.   "CADY",
  809.   "CAFE",
  810.   "CAGE",
  811.   "CAIN",
  812.   "CAKE",
  813.   "CALF",
  814.   "CALL",
  815.   "CALM",
  816.   "CAME",
  817.   "CANE",
  818.   "CANT",
  819.   "CARD",
  820.   "CARE",
  821.   "CARL",
  822.   "CARR",
  823.   "CART",
  824.   "CASE",
  825.   "CASH",
  826.   "CASK",
  827.   "CAST",
  828.   "CAVE",
  829.   "CEIL",
  830.   "CELL",
  831.   "CENT",
  832.   "CERN",
  833.   "CHAD",
  834.   "CHAR",
  835.   "CHAT",
  836.   "CHAW",
  837.   "CHEF",
  838.   "CHEN",
  839.   "CHEW",
  840.   "CHIC",
  841.   "CHIN",
  842.   "CHOU",
  843.   "CHOW",
  844.   "CHUB",
  845.   "CHUG",
  846.   "CHUM",
  847.   "CITE",
  848.   "CITY",
  849.   "CLAD",
  850.   "CLAM",
  851.   "CLAN",
  852.   "CLAW",
  853.   "CLAY",
  854.   "CLOD",
  855.   "CLOG",
  856.   "CLOT",
  857.   "CLUB",
  858.   "CLUE",
  859.   "COAL",
  860.   "COAT",
  861.   "COCA",
  862.   "COCK",
  863.   "COCO",
  864.   "CODA",
  865.   "CODE",
  866.   "CODY",
  867.   "COED",
  868.   "COIL",
  869.   "COIN",
  870.   "COKE",
  871.   "COLA",
  872.   "COLD",
  873.   "COLT",
  874.   "COMA",
  875.   "COMB",
  876.   "COME",
  877.   "COOK",
  878.   "COOL",
  879.   "COON",
  880.   "COOT",
  881.   "CORD",
  882.   "CORE",
  883.   "CORK",
  884.   "CORN",
  885.   "COST",
  886.   "COVE",
  887.   "COWL",
  888.   "CRAB",
  889.   "CRAG",
  890.   "CRAM",
  891.   "CRAY",
  892.   "CREW",
  893.   "CRIB",
  894.   "CROW",
  895.   "CRUD",
  896.   "CUBA",
  897.   "CUBE",
  898.   "CUFF",
  899.   "CULL",
  900.   "CULT",
  901.   "CUNY",
  902.   "CURB",
  903.   "CURD",
  904.   "CURE",
  905.   "CURL",
  906.   "CURT",
  907.   "CUTS",
  908.   "DADE",
  909.   "DALE",
  910.   "DAME",
  911.   "DANA",
  912.   "DANE",
  913.   "DANG",
  914.   "DANK",
  915.   "DARE",
  916.   "DARK",
  917.   "DARN",
  918.   "DART",
  919.   "DASH",
  920.   "DATA",
  921.   "DATE",
  922.   "DAVE",
  923.   "DAVY",
  924.   "DAWN",
  925.   "DAYS",
  926.   "DEAD",
  927.   "DEAF",
  928.   "DEAL",
  929.   "DEAN",
  930.   "DEAR",
  931.   "DEBT",
  932.   "DECK",
  933.   "DEED",
  934.   "DEEM",
  935.   "DEER",
  936.   "DEFT",
  937.   "DEFY",
  938.   "DELL",
  939.   "DENT",
  940.   "DENY",
  941.   "DESK",
  942.   "DIAL",
  943.   "DICE",
  944.   "DIED",
  945.   "DIET",
  946.   "DIME",
  947.   "DINE",
  948.   "DING",
  949.   "DINT",
  950.   "DIRE",
  951.   "DIRT",
  952.   "DISC",
  953.   "DISH",
  954.   "DISK",
  955.   "DIVE",
  956.   "DOCK",
  957.   "DOES",
  958.   "DOLE",
  959.   "DOLL",
  960.   "DOLT",
  961.   "DOME",
  962.   "DONE",
  963.   "DOOM",
  964.   "DOOR",
  965.   "DORA",
  966.   "DOSE",
  967.   "DOTE",
  968.   "DOUG",
  969.   "DOUR",
  970.   "DOVE",
  971.   "DOWN",
  972.   "DRAB",
  973.   "DRAG",
  974.   "DRAM",
  975.   "DRAW",
  976.   "DREW",
  977.   "DRUB",
  978.   "DRUG",
  979.   "DRUM",
  980.   "DUAL",
  981.   "DUCK",
  982.   "DUCT",
  983.   "DUEL",
  984.   "DUET",
  985.   "DUKE",
  986.   "DULL",
  987.   "DUMB",
  988.   "DUNE",
  989.   "DUNK",
  990.   "DUSK",
  991.   "DUST",
  992.   "DUTY",
  993.   "EACH",
  994.   "EARL",
  995.   "EARN",
  996.   "EASE",
  997.   "EAST",
  998.   "EASY",
  999.   "EBEN",
  1000.   "ECHO",
  1001.   "EDDY",
  1002.   "EDEN",
  1003.   "EDGE",
  1004.   "EDGY",
  1005.   "EDIT",
  1006.   "EDNA",
  1007.   "EGAN",
  1008.   "ELAN",
  1009.   "ELBA",
  1010.   "ELLA",
  1011.   "ELSE",
  1012.   "EMIL",
  1013.   "EMIT",
  1014.   "EMMA",
  1015.   "ENDS",
  1016.   "ERIC",
  1017.   "EROS",
  1018.   "EVEN",
  1019.   "EVER",
  1020.   "EVIL",
  1021.   "EYED",
  1022.   "FACE",
  1023.   "FACT",
  1024.   "FADE",
  1025.   "FAIL",
  1026.   "FAIN",
  1027.   "FAIR",
  1028.   "FAKE",
  1029.   "FALL",
  1030.   "FAME",
  1031.   "FANG",
  1032.   "FARM",
  1033.   "FAST",
  1034.   "FATE",
  1035.   "FAWN",
  1036.   "FEAR",
  1037.   "FEAT",
  1038.   "FEED",
  1039.   "FEEL",
  1040.   "FEET",
  1041.   "FELL",
  1042.   "FELT",
  1043.   "FEND",
  1044.   "FERN",
  1045.   "FEST",
  1046.   "FEUD",
  1047.   "FIEF",
  1048.   "FIGS",
  1049.   "FILE",
  1050.   "FILL",
  1051.   "FILM",
  1052.   "FIND",
  1053.   "FINE",
  1054.   "FINK",
  1055.   "FIRE",
  1056.   "FIRM",
  1057.   "FISH",
  1058.   "FISK",
  1059.   "FIST",
  1060.   "FITS",
  1061.   "FIVE",
  1062.   "FLAG",
  1063.   "FLAK",
  1064.   "FLAM",
  1065.   "FLAT",
  1066.   "FLAW",
  1067.   "FLEA",
  1068.   "FLED",
  1069.   "FLEW",
  1070.   "FLIT",
  1071.   "FLOC",
  1072.   "FLOG",
  1073.   "FLOW",
  1074.   "FLUB",
  1075.   "FLUE",
  1076.   "FOAL",
  1077.   "FOAM",
  1078.   "FOGY",
  1079.   "FOIL",
  1080.   "FOLD",
  1081.   "FOLK",
  1082.   "FOND",
  1083.   "FONT",
  1084.   "FOOD",
  1085.   "FOOL",
  1086.   "FOOT",
  1087.   "FORD",
  1088.   "FORE",
  1089.   "FORK",
  1090.   "FORM",
  1091.   "FORT",
  1092.   "FOSS",
  1093.   "FOUL",
  1094.   "FOUR",
  1095.   "FOWL",
  1096.   "FRAU",
  1097.   "FRAY",
  1098.   "FRED",
  1099.   "FREE",
  1100.   "FRET",
  1101.   "FREY",
  1102.   "FROG",
  1103.   "FROM",
  1104.   "FUEL",
  1105.   "FULL",
  1106.   "FUME",
  1107.   "FUND",
  1108.   "FUNK",
  1109.   "FURY",
  1110.   "FUSE",
  1111.   "FUSS",
  1112.   "GAFF",
  1113.   "GAGE",
  1114.   "GAIL",
  1115.   "GAIN",
  1116.   "GAIT",
  1117.   "GALA",
  1118.   "GALE",
  1119.   "GALL",
  1120.   "GALT",
  1121.   "GAME",
  1122.   "GANG",
  1123.   "GARB",
  1124.   "GARY",
  1125.   "GASH",
  1126.   "GATE",
  1127.   "GAUL",
  1128.   "GAUR",
  1129.   "GAVE",
  1130.   "GAWK",
  1131.   "GEAR",
  1132.   "GELD",
  1133.   "GENE",
  1134.   "GENT",
  1135.   "GERM",
  1136.   "GETS",
  1137.   "GIBE",
  1138.   "GIFT",
  1139.   "GILD",
  1140.   "GILL",
  1141.   "GILT",
  1142.   "GINA",
  1143.   "GIRD",
  1144.   "GIRL",
  1145.   "GIST",
  1146.   "GIVE",
  1147.   "GLAD",
  1148.   "GLEE",
  1149.   "GLEN",
  1150.   "GLIB",
  1151.   "GLOB",
  1152.   "GLOM",
  1153.   "GLOW",
  1154.   "GLUE",
  1155.   "GLUM",
  1156.   "GLUT",
  1157.   "GOAD",
  1158.   "GOAL",
  1159.   "GOAT",
  1160.   "GOER",
  1161.   "GOES",
  1162.   "GOLD",
  1163.   "GOLF",
  1164.   "GONE",
  1165.   "GONG",
  1166.   "GOOD",
  1167.   "GOOF",
  1168.   "GORE",
  1169.   "GORY",
  1170.   "GOSH",
  1171.   "GOUT",
  1172.   "GOWN",
  1173.   "GRAB",
  1174.   "GRAD",
  1175.   "GRAY",
  1176.   "GREG",
  1177.   "GREW",
  1178.   "GREY",
  1179.   "GRID",
  1180.   "GRIM",
  1181.   "GRIN",
  1182.   "GRIT",
  1183.   "GROW",
  1184.   "GRUB",
  1185.   "GULF",
  1186.   "GULL",
  1187.   "GUNK",
  1188.   "GURU",
  1189.   "GUSH",
  1190.   "GUST",
  1191.   "GWEN",
  1192.   "GWYN",
  1193.   "HAAG",
  1194.   "HAAS",
  1195.   "HACK",
  1196.   "HAIL",
  1197.   "HAIR",
  1198.   "HALE",
  1199.   "HALF",
  1200.   "HALL",
  1201.   "HALO",
  1202.   "HALT",
  1203.   "HAND",
  1204.   "HANG",
  1205.   "HANK",
  1206.   "HANS",
  1207.   "HARD",
  1208.   "HARK",
  1209.   "HARM",
  1210.   "HART",
  1211.   "HASH",
  1212.   "HAST",
  1213.   "HATE",
  1214.   "HATH",
  1215.   "HAUL",
  1216.   "HAVE",
  1217.   "HAWK",
  1218.   "HAYS",
  1219.   "HEAD",
  1220.   "HEAL",
  1221.   "HEAR",
  1222.   "HEAT",
  1223.   "HEBE",
  1224.   "HECK",
  1225.   "HEED",
  1226.   "HEEL",
  1227.   "HEFT",
  1228.   "HELD",
  1229.   "HELL",
  1230.   "HELM",
  1231.   "HERB",
  1232.   "HERD",
  1233.   "HERE",
  1234.   "HERO",
  1235.   "HERS",
  1236.   "HESS",
  1237.   "HEWN",
  1238.   "HICK",
  1239.   "HIDE",
  1240.   "HIGH",
  1241.   "HIKE",
  1242.   "HILL",
  1243.   "HILT",
  1244.   "HIND",
  1245.   "HINT",
  1246.   "HIRE",
  1247.   "HISS",
  1248.   "HIVE",
  1249.   "HOBO",
  1250.   "HOCK",
  1251.   "HOFF",
  1252.   "HOLD",
  1253.   "HOLE",
  1254.   "HOLM",
  1255.   "HOLT",
  1256.   "HOME",
  1257.   "HONE",
  1258.   "HONK",
  1259.   "HOOD",
  1260.   "HOOF",
  1261.   "HOOK",
  1262.   "HOOT",
  1263.   "HORN",
  1264.   "HOSE",
  1265.   "HOST",
  1266.   "HOUR",
  1267.   "HOVE",
  1268.   "HOWE",
  1269.   "HOWL",
  1270.   "HOYT",
  1271.   "HUCK",
  1272.   "HUED",
  1273.   "HUFF",
  1274.   "HUGE",
  1275.   "HUGH",
  1276.   "HUGO",
  1277.   "HULK",
  1278.   "HULL",
  1279.   "HUNK",
  1280.   "HUNT",
  1281.   "HURD",
  1282.   "HURL",
  1283.   "HURT",
  1284.   "HUSH",
  1285.   "HYDE",
  1286.   "HYMN",
  1287.   "IBIS",
  1288.   "ICON",
  1289.   "IDEA",
  1290.   "IDLE",
  1291.   "IFFY",
  1292.   "INCA",
  1293.   "INCH",
  1294.   "INTO",
  1295.   "IONS",
  1296.   "IOTA",
  1297.   "IOWA",
  1298.   "IRIS",
  1299.   "IRMA",
  1300.   "IRON",
  1301.   "ISLE",
  1302.   "ITCH",
  1303.   "ITEM",
  1304.   "IVAN",
  1305.   "JACK",
  1306.   "JADE",
  1307.   "JAIL",
  1308.   "JAKE",
  1309.   "JANE",
  1310.   "JAVA",
  1311.   "JEAN",
  1312.   "JEFF",
  1313.   "JERK",
  1314.   "JESS",
  1315.   "JEST",
  1316.   "JIBE",
  1317.   "JILL",
  1318.   "JILT",
  1319.   "JIVE",
  1320.   "JOAN",
  1321.   "JOBS",
  1322.   "JOCK",
  1323.   "JOEL",
  1324.   "JOEY",
  1325.   "JOHN",
  1326.   "JOIN",
  1327.   "JOKE",
  1328.   "JOLT",
  1329.   "JOVE",
  1330.   "JUDD",
  1331.   "JUDE",
  1332.   "JUDO",
  1333.   "JUDY",
  1334.   "JUJU",
  1335.   "JUKE",
  1336.   "JULY",
  1337.   "JUNE",
  1338.   "JUNK",
  1339.   "JUNO",
  1340.   "JURY",
  1341.   "JUST",
  1342.   "JUTE",
  1343.   "KAHN",
  1344.   "KALE",
  1345.   "KANE",
  1346.   "KANT",
  1347.   "KARL",
  1348.   "KATE",
  1349.   "KEEL",
  1350.   "KEEN",
  1351.   "KENO",
  1352.   "KENT",
  1353.   "KERN",
  1354.   "KERR",
  1355.   "KEYS",
  1356.   "KICK",
  1357.   "KILL",
  1358.   "KIND",
  1359.   "KING",
  1360.   "KIRK",
  1361.   "KISS",
  1362.   "KITE",
  1363.   "KLAN",
  1364.   "KNEE",
  1365.   "KNEW",
  1366.   "KNIT",
  1367.   "KNOB",
  1368.   "KNOT",
  1369.   "KNOW",
  1370.   "KOCH",
  1371.   "KONG",
  1372.   "KUDO",
  1373.   "KURD",
  1374.   "KURT",
  1375.   "KYLE",
  1376.   "LACE",
  1377.   "LACK",
  1378.   "LACY",
  1379.   "LADY",
  1380.   "LAID",
  1381.   "LAIN",
  1382.   "LAIR",
  1383.   "LAKE",
  1384.   "LAMB",
  1385.   "LAME",
  1386.   "LAND",
  1387.   "LANE",
  1388.   "LANG",
  1389.   "LARD",
  1390.   "LARK",
  1391.   "LASS",
  1392.   "LAST",
  1393.   "LATE",
  1394.   "LAUD",
  1395.   "LAVA",
  1396.   "LAWN",
  1397.   "LAWS",
  1398.   "LAYS",
  1399.   "LEAD",
  1400.   "LEAF",
  1401.   "LEAK",
  1402.   "LEAN",
  1403.   "LEAR",
  1404.   "LEEK",
  1405.   "LEER",
  1406.   "LEFT",
  1407.   "LEND",
  1408.   "LENS",
  1409.   "LENT",
  1410.   "LEON",
  1411.   "LESK",
  1412.   "LESS",
  1413.   "LEST",
  1414.   "LETS",
  1415.   "LIAR",
  1416.   "LICE",
  1417.   "LICK",
  1418.   "LIED",
  1419.   "LIEN",
  1420.   "LIES",
  1421.   "LIEU",
  1422.   "LIFE",
  1423.   "LIFT",
  1424.   "LIKE",
  1425.   "LILA",
  1426.   "LILT",
  1427.   "LILY",
  1428.   "LIMA",
  1429.   "LIMB",
  1430.   "LIME",
  1431.   "LIND",
  1432.   "LINE",
  1433.   "LINK",
  1434.   "LINT",
  1435.   "LION",
  1436.   "LISA",
  1437.   "LIST",
  1438.   "LIVE",
  1439.   "LOAD",
  1440.   "LOAF",
  1441.   "LOAM",
  1442.   "LOAN",
  1443.   "LOCK",
  1444.   "LOFT",
  1445.   "LOGE",
  1446.   "LOIS",
  1447.   "LOLA",
  1448.   "LONE",
  1449.   "LONG",
  1450.   "LOOK",
  1451.   "LOON",
  1452.   "LOOT",
  1453.   "LORD",
  1454.   "LORE",
  1455.   "LOSE",
  1456.   "LOSS",
  1457.   "LOST",
  1458.   "LOUD",
  1459.   "LOVE",
  1460.   "LOWE",
  1461.   "LUCK",
  1462.   "LUCY",
  1463.   "LUGE",
  1464.   "LUKE",
  1465.   "LULU",
  1466.   "LUND",
  1467.   "LUNG",
  1468.   "LURA",
  1469.   "LURE",
  1470.   "LURK",
  1471.   "LUSH",
  1472.   "LUST",
  1473.   "LYLE",
  1474.   "LYNN",
  1475.   "LYON",
  1476.   "LYRA",
  1477.   "MACE",
  1478.   "MADE",
  1479.   "MAGI",
  1480.   "MAID",
  1481.   "MAIL",
  1482.   "MAIN",
  1483.   "MAKE",
  1484.   "MALE",
  1485.   "MALI",
  1486.   "MALL",
  1487.   "MALT",
  1488.   "MANA",
  1489.   "MANN",
  1490.   "MANY",
  1491.   "MARC",
  1492.   "MARE",
  1493.   "MARK",
  1494.   "MARS",
  1495.   "MART",
  1496.   "MARY",
  1497.   "MASH",
  1498.   "MASK",
  1499.   "MASS",
  1500.   "MAST",
  1501.   "MATE",
  1502.   "MATH",
  1503.   "MAUL",
  1504.   "MAYO",
  1505.   "MEAD",
  1506.   "MEAL",
  1507.   "MEAN",
  1508.   "MEAT",
  1509.   "MEEK",
  1510.   "MEET",
  1511.   "MELD",
  1512.   "MELT",
  1513.   "MEMO",
  1514.   "MEND",
  1515.   "MENU",
  1516.   "MERT",
  1517.   "MESH",
  1518.   "MESS",
  1519.   "MICE",
  1520.   "MIKE",
  1521.   "MILD",
  1522.   "MILE",
  1523.   "MILK",
  1524.   "MILL",
  1525.   "MILT",
  1526.   "MIMI",
  1527.   "MIND",
  1528.   "MINE",
  1529.   "MINI",
  1530.   "MINK",
  1531.   "MINT",
  1532.   "MIRE",
  1533.   "MISS",
  1534.   "MIST",
  1535.   "MITE",
  1536.   "MITT",
  1537.   "MOAN",
  1538.   "MOAT",
  1539.   "MOCK",
  1540.   "MODE",
  1541.   "MOLD",
  1542.   "MOLE",
  1543.   "MOLL",
  1544.   "MOLT",
  1545.   "MONA",
  1546.   "MONK",
  1547.   "MONT",
  1548.   "MOOD",
  1549.   "MOON",
  1550.   "MOOR",
  1551.   "MOOT",
  1552.   "MORE",
  1553.   "MORN",
  1554.   "MORT",
  1555.   "MOSS",
  1556.   "MOST",
  1557.   "MOTH",
  1558.   "MOVE",
  1559.   "MUCH",
  1560.   "MUCK",
  1561.   "MUDD",
  1562.   "MUFF",
  1563.   "MULE",
  1564.   "MULL",
  1565.   "MURK",
  1566.   "MUSH",
  1567.   "MUST",
  1568.   "MUTE",
  1569.   "MUTT",
  1570.   "MYRA",
  1571.   "MYTH",
  1572.   "NAGY",
  1573.   "NAIL",
  1574.   "NAIR",
  1575.   "NAME",
  1576.   "NARY",
  1577.   "NASH",
  1578.   "NAVE",
  1579.   "NAVY",
  1580.   "NEAL",
  1581.   "NEAR",
  1582.   "NEAT",
  1583.   "NECK",
  1584.   "NEED",
  1585.   "NEIL",
  1586.   "NELL",
  1587.   "NEON",
  1588.   "NERO",
  1589.   "NESS",
  1590.   "NEST",
  1591.   "NEWS",
  1592.   "NEWT",
  1593.   "NIBS",
  1594.   "NICE",
  1595.   "NICK",
  1596.   "NILE",
  1597.   "NINA",
  1598.   "NINE",
  1599.   "NOAH",
  1600.   "NODE",
  1601.   "NOEL",
  1602.   "NOLL",
  1603.   "NONE",
  1604.   "NOOK",
  1605.   "NOON",
  1606.   "NORM",
  1607.   "NOSE",
  1608.   "NOTE",
  1609.   "NOUN",
  1610.   "NOVA",
  1611.   "NUDE",
  1612.   "NULL",
  1613.   "NUMB",
  1614.   "OATH",
  1615.   "OBEY",
  1616.   "OBOE",
  1617.   "ODIN",
  1618.   "OHIO",
  1619.   "OILY",
  1620.   "OINT",
  1621.   "OKAY",
  1622.   "OLAF",
  1623.   "OLDY",
  1624.   "OLGA",
  1625.   "OLIN",
  1626.   "OMAN",
  1627.   "OMEN",
  1628.   "OMIT",
  1629.   "ONCE",
  1630.   "ONES",
  1631.   "ONLY",
  1632.   "ONTO",
  1633.   "ONUS",
  1634.   "ORAL",
  1635.   "ORGY",
  1636.   "OSLO",
  1637.   "OTIS",
  1638.   "OTTO",
  1639.   "OUCH",
  1640.   "OUST",
  1641.   "OUTS",
  1642.   "OVAL",
  1643.   "OVEN",
  1644.   "OVER",
  1645.   "OWLY",
  1646.   "OWNS",
  1647.   "QUAD",
  1648.   "QUIT",
  1649.   "QUOD",
  1650.   "RACE",
  1651.   "RACK",
  1652.   "RACY",
  1653.   "RAFT",
  1654.   "RAGE",
  1655.   "RAID",
  1656.   "RAIL",
  1657.   "RAIN",
  1658.   "RAKE",
  1659.   "RANK",
  1660.   "RANT",
  1661.   "RARE",
  1662.   "RASH",
  1663.   "RATE",
  1664.   "RAVE",
  1665.   "RAYS",
  1666.   "READ",
  1667.   "REAL",
  1668.   "REAM",
  1669.   "REAR",
  1670.   "RECK",
  1671.   "REED",
  1672.   "REEF",
  1673.   "REEK",
  1674.   "REEL",
  1675.   "REID",
  1676.   "REIN",
  1677.   "RENA",
  1678.   "REND",
  1679.   "RENT",
  1680.   "REST",
  1681.   "RICE",
  1682.   "RICH",
  1683.   "RICK",
  1684.   "RIDE",
  1685.   "RIFT",
  1686.   "RILL",
  1687.   "RIME",
  1688.   "RING",
  1689.   "RINK",
  1690.   "RISE",
  1691.   "RISK",
  1692.   "RITE",
  1693.   "ROAD",
  1694.   "ROAM",
  1695.   "ROAR",
  1696.   "ROBE",
  1697.   "ROCK",
  1698.   "RODE",
  1699.   "ROIL",
  1700.   "ROLL",
  1701.   "ROME",
  1702.   "ROOD",
  1703.   "ROOF",
  1704.   "ROOK",
  1705.   "ROOM",
  1706.   "ROOT",
  1707.   "ROSA",
  1708.   "ROSE",
  1709.   "ROSS",
  1710.   "ROSY",
  1711.   "ROTH",
  1712.   "ROUT",
  1713.   "ROVE",
  1714.   "ROWE",
  1715.   "ROWS",
  1716.   "RUBE",
  1717.   "RUBY",
  1718.   "RUDE",
  1719.   "RUDY",
  1720.   "RUIN",
  1721.   "RULE",
  1722.   "RUNG",
  1723.   "RUNS",
  1724.   "RUNT",
  1725.   "RUSE",
  1726.   "RUSH",
  1727.   "RUSK",
  1728.   "RUSS",
  1729.   "RUST",
  1730.   "RUTH",
  1731.   "SACK",
  1732.   "SAFE",
  1733.   "SAGE",
  1734.   "SAID",
  1735.   "SAIL",
  1736.   "SALE",
  1737.   "SALK",
  1738.   "SALT",
  1739.   "SAME",
  1740.   "SAND",
  1741.   "SANE",
  1742.   "SANG",
  1743.   "SANK",
  1744.   "SARA",
  1745.   "SAUL",
  1746.   "SAVE",
  1747.   "SAYS",
  1748.   "SCAN",
  1749.   "SCAR",
  1750.   "SCAT",
  1751.   "SCOT",
  1752.   "SEAL",
  1753.   "SEAM",
  1754.   "SEAR",
  1755.   "SEAT",
  1756.   "SEED",
  1757.   "SEEK",
  1758.   "SEEM",
  1759.   "SEEN",
  1760.   "SEES",
  1761.   "SELF",
  1762.   "SELL",
  1763.   "SEND",
  1764.   "SENT",
  1765.   "SETS",
  1766.   "SEWN",
  1767.   "SHAG",
  1768.   "SHAM",
  1769.   "SHAW",
  1770.   "SHAY",
  1771.   "SHED",
  1772.   "SHIM",
  1773.   "SHIN",
  1774.   "SHOD",
  1775.   "SHOE",
  1776.   "SHOT",
  1777.   "SHOW",
  1778.   "SHUN",
  1779.   "SHUT",
  1780.   "SICK",
  1781.   "SIDE",
  1782.   "SIFT",
  1783.   "SIGH",
  1784.   "SIGN",
  1785.   "SILK",
  1786.   "SILL",
  1787.   "SILO",
  1788.   "SILT",
  1789.   "SINE",
  1790.   "SING",
  1791.   "SINK",
  1792.   "SIRE",
  1793.   "SITE",
  1794.   "SITS",
  1795.   "SITU",
  1796.   "SKAT",
  1797.   "SKEW",
  1798.   "SKID",
  1799.   "SKIM",
  1800.   "SKIN",
  1801.   "SKIT",
  1802.   "SLAB",
  1803.   "SLAM",
  1804.   "SLAT",
  1805.   "SLAY",
  1806.   "SLED",
  1807.   "SLEW",
  1808.   "SLID",
  1809.   "SLIM",
  1810.   "SLIT",
  1811.   "SLOB",
  1812.   "SLOG",
  1813.   "SLOT",
  1814.   "SLOW",
  1815.   "SLUG",
  1816.   "SLUM",
  1817.   "SLUR",
  1818.   "SMOG",
  1819.   "SMUG",
  1820.   "SNAG",
  1821.   "SNOB",
  1822.   "SNOW",
  1823.   "SNUB",
  1824.   "SNUG",
  1825.   "SOAK",
  1826.   "SOAR",
  1827.   "SOCK",
  1828.   "SODA",
  1829.   "SOFA",
  1830.   "SOFT",
  1831.   "SOIL",
  1832.   "SOLD",
  1833.   "SOME",
  1834.   "SONG",
  1835.   "SOON",
  1836.   "SOOT",
  1837.   "SORE",
  1838.   "SORT",
  1839.   "SOUL",
  1840.   "SOUR",
  1841.   "SOWN",
  1842.   "STAB",
  1843.   "STAG",
  1844.   "STAN",
  1845.   "STAR",
  1846.   "STAY",
  1847.   "STEM",
  1848.   "STEW",
  1849.   "STIR",
  1850.   "STOW",
  1851.   "STUB",
  1852.   "STUN",
  1853.   "SUCH",
  1854.   "SUDS",
  1855.   "SUIT",
  1856.   "SULK",
  1857.   "SUMS",
  1858.   "SUNG",
  1859.   "SUNK",
  1860.   "SURE",
  1861.   "SURF",
  1862.   "SWAB",
  1863.   "SWAG",
  1864.   "SWAM",
  1865.   "SWAN",
  1866.   "SWAT",
  1867.   "SWAY",
  1868.   "SWIM",
  1869.   "SWUM",
  1870.   "TACK",
  1871.   "TACT",
  1872.   "TAIL",
  1873.   "TAKE",
  1874.   "TALE",
  1875.   "TALK",
  1876.   "TALL",
  1877.   "TANK",
  1878.   "TASK",
  1879.   "TATE",
  1880.   "TAUT",
  1881.   "TEAL",
  1882.   "TEAM",
  1883.   "TEAR",
  1884.   "TECH",
  1885.   "TEEM",
  1886.   "TEEN",
  1887.   "TEET",
  1888.   "TELL",
  1889.   "TEND",
  1890.   "TENT",
  1891.   "TERM",
  1892.   "TERN",
  1893.   "TESS",
  1894.   "TEST",
  1895.   "THAN",
  1896.   "THAT",
  1897.   "THEE",
  1898.   "THEM",
  1899.   "THEN",
  1900.   "THEY",
  1901.   "THIN",
  1902.   "THIS",
  1903.   "THUD",
  1904.   "THUG",
  1905.   "TICK",
  1906.   "TIDE",
  1907.   "TIDY",
  1908.   "TIED",
  1909.   "TIER",
  1910.   "TILE",
  1911.   "TILL",
  1912.   "TILT",
  1913.   "TIME",
  1914.   "TINA",
  1915.   "TINE",
  1916.   "TINT",
  1917.   "TINY",
  1918.   "TIRE",
  1919.   "TOAD",
  1920.   "TOGO",
  1921.   "TOIL",
  1922.   "TOLD",
  1923.   "TOLL",
  1924.   "TONE",
  1925.   "TONG",
  1926.   "TONY",
  1927.   "TOOK",
  1928.   "TOOL",
  1929.   "TOOT",
  1930.   "TORE",
  1931.   "TORN",
  1932.   "TOTE",
  1933.   "TOUR",
  1934.   "TOUT",
  1935.   "TOWN",
  1936.   "TRAG",
  1937.   "TRAM",
  1938.   "TRAY",
  1939.   "TREE",
  1940.   "TREK",
  1941.   "TRIG",
  1942.   "TRIM",
  1943.   "TRIO",
  1944.   "TROD",
  1945.   "TROT",
  1946.   "TROY",
  1947.   "TRUE",
  1948.   "TUBA",
  1949.   "TUBE",
  1950.   "TUCK",
  1951.   "TUFT",
  1952.   "TUNA",
  1953.   "TUNE",
  1954.   "TUNG",
  1955.   "TURF",
  1956.   "TURN",
  1957.   "TUSK",
  1958.   "TWIG",
  1959.   "TWIN",
  1960.   "TWIT",
  1961.   "ULAN",
  1962.   "UNIT",
  1963.   "URGE",
  1964.   "USED",
  1965.   "USER",
  1966.   "USES",
  1967.   "UTAH",
  1968.   "VAIL",
  1969.   "VAIN",
  1970.   "VALE",
  1971.   "VARY",
  1972.   "VASE",
  1973.   "VAST",
  1974.   "VEAL",
  1975.   "VEDA",
  1976.   "VEIL",
  1977.   "VEIN",
  1978.   "VEND",
  1979.   "VENT",
  1980.   "VERB",
  1981.   "VERY",
  1982.   "VETO",
  1983.   "VICE",
  1984.   "VIEW",
  1985.   "VINE",
  1986.   "VISE",
  1987.   "VOID",
  1988.   "VOLT",
  1989.   "VOTE",
  1990.   "WACK",
  1991.   "WADE",
  1992.   "WAGE",
  1993.   "WAIL",
  1994.   "WAIT",
  1995.   "WAKE",
  1996.   "WALE",
  1997.   "WALK",
  1998.   "WALL",
  1999.   "WALT",
  2000.   "WAND",
  2001.   "WANE",
  2002.   "WANG",
  2003.   "WANT",
  2004.   "WARD",
  2005.   "WARM",
  2006.   "WARN",
  2007.   "WART",
  2008.   "WASH",
  2009.   "WAST",
  2010.   "WATS",
  2011.   "WATT",
  2012.   "WAVE",
  2013.   "WAVY",
  2014.   "WAYS",
  2015.   "WEAK",
  2016.   "WEAL",
  2017.   "WEAN",
  2018.   "WEAR",
  2019.   "WEED",
  2020.   "WEEK",
  2021.   "WEIR",
  2022.   "WELD",
  2023.   "WELL",
  2024.   "WELT",
  2025.   "WENT",
  2026.   "WERE",
  2027.   "WERT",
  2028.   "WEST",
  2029.   "WHAM",
  2030.   "WHAT",
  2031.   "WHEE",
  2032.   "WHEN",
  2033.   "WHET",
  2034.   "WHOA",
  2035.   "WHOM",
  2036.   "WICK",
  2037.   "WIFE",
  2038.   "WILD",
  2039.   "WILL",
  2040.   "WIND",
  2041.   "WINE",
  2042.   "WING",
  2043.   "WINK",
  2044.   "WINO",
  2045.   "WIRE",
  2046.   "WISE",
  2047.   "WISH",
  2048.   "WITH",
  2049.   "WOLF",
  2050.   "WONT",
  2051.   "WOOD",
  2052.   "WOOL",
  2053.   "WORD",
  2054.   "WORE",
  2055.   "WORK",
  2056.   "WORM",
  2057.   "WORN",
  2058.   "WOVE",
  2059.   "WRIT",
  2060.   "WYNN",
  2061.   "YALE",
  2062.   "YANG",
  2063.   "YANK",
  2064.   "YARD",
  2065.   "YARN",
  2066.   "YAWL",
  2067.   "YAWN",
  2068.   "YEAH",
  2069.   "YEAR",
  2070.   "YELL",
  2071.   "YOGA",
  2072.   "YOKE"
  2073. };
  2074.  
  2075. /* Encode 8 bytes in 'c' as a string of English words.
  2076.  * Returns a pointer to a static buffer
  2077.  */
  2078. char *
  2079.  btoe (engout, c)
  2080.   char *c, *engout;
  2081. {
  2082.   char cp[9];            /* add in room for the parity 2 bits */
  2083.   int p, i;
  2084.  
  2085.   engout[0] = '\0';
  2086.   memcpy (cp, c, 8);
  2087.   /* compute parity */
  2088.   for (p = 0, i = 0; i < 64; i += 2)
  2089.     p += extract (cp, i, 2);
  2090.  
  2091.   cp[8] = (char) p << 6;
  2092.  
  2093.   strncat (engout, &Wp[extract (cp, 0, 11)][0], 4);
  2094.   strcat (engout, " ");
  2095.   strncat (engout, &Wp[extract (cp, 11, 11)][0], 4);
  2096.   strcat (engout, " ");
  2097.   strncat (engout, &Wp[extract (cp, 22, 11)][0], 4);
  2098.   strcat (engout, " ");
  2099.   strncat (engout, &Wp[extract (cp, 33, 11)][0], 4);
  2100.   strcat (engout, " ");
  2101.   strncat (engout, &Wp[extract (cp, 44, 11)][0], 4);
  2102.   strcat (engout, " ");
  2103.   strncat (engout, &Wp[extract (cp, 55, 11)][0], 4);
  2104.  
  2105. #ifdef    notdef
  2106.   printf ("engout is %s\n\r", engout);
  2107. #endif
  2108.   return (engout);
  2109. }
  2110.  
  2111. /* convert English to binary
  2112.  * returns 1 OK - all good words and parity is OK
  2113.  *         0 word not in data base
  2114.  *        -1 badly formed in put ie > 4 char word
  2115.  *        -2 words OK but parity is wrong
  2116.  */
  2117. int
  2118.  etob (out, e)
  2119.   char *out;
  2120.   char *e;
  2121. {
  2122.   char *word;
  2123.   int i, p, v, l, low, high;
  2124.   char b[9];
  2125.   char input[36];
  2126.  
  2127.   if (e == NULL)
  2128.     return -1;
  2129.  
  2130.   strncpy (input, e, sizeof (input));
  2131.   memset (b, 0, sizeof (b));
  2132.   memset (out, 0, 8);
  2133.   for (i = 0, p = 0; i < 6; i++, p += 11) 
  2134.   {
  2135.     if ((word = strtok (i == 0 ? input : NULL, " ")) == NULL) 
  2136.       return -1;
  2137.  
  2138.     l = strlen (word);
  2139.     if (l > 4 || l < 1)
  2140.       return -1;
  2141.     else if (l < 4)
  2142.     {
  2143.       low = 0;
  2144.       high = 570;
  2145.     }
  2146.     else
  2147.     {
  2148.       low = 571;
  2149.       high = 2047;
  2150.     }
  2151.     standard (word);
  2152.  
  2153.     if ((v = wsrch (word, low, high)) < 0) 
  2154.        return 0;
  2155.  
  2156.     insert (b, v, p, 11);
  2157.   }
  2158.  
  2159.   /* now check the parity of what we got */
  2160.   for (p = 0, i = 0; i < 64; i += 2)
  2161.     p += extract (b, i, 2);
  2162.  
  2163.   if ((p & 3) != extract (b, 64, 2)) 
  2164.      return -2;
  2165.  
  2166.   memcpy (out, b, 8);
  2167.  
  2168.   return 1;
  2169. }
  2170.  
  2171. /* Display 8 bytes as a series of 16-bit hex digits */
  2172. char *
  2173.  put8 (out, s)
  2174.   char *out;
  2175.   char *s;
  2176. {
  2177.   sprintf (out, "%02X%02X %02X%02X %02X%02X %02X%02X",
  2178.        s[0] & 0xff, s[1] & 0xff, s[2] & 0xff,
  2179.        s[3] & 0xff, s[4] & 0xff, s[5] & 0xff,
  2180.        s[6] & 0xff, s[7] & 0xff);
  2181.   return out;
  2182. }
  2183.  
  2184. #ifdef    notdef
  2185. /* Encode 8 bytes in 'cp' as stream of ascii letters.
  2186.  * Provided as a possible alternative to btoe()
  2187.  */
  2188. char *
  2189.  btoc (cp)
  2190.   char *cp;
  2191. {
  2192.   int i;
  2193.   static char out[31];
  2194.  
  2195.   /* code out put by characters 6 bits each added to 0x21 (!) */
  2196.   for (i = 0; i <= 10; i++)
  2197.   {
  2198.     /* last one is only 4 bits not 6 */
  2199.     out[i] = '!' + extract (cp, 6 * i, i >= 10 ? 4 : 6);
  2200.   }
  2201.   out[i] = '\0';
  2202.   return (out);
  2203. }
  2204.  
  2205. #endif
  2206.  
  2207. /* Internal subroutines for word encoding/decoding */
  2208.  
  2209. /* Dictionary binary search */
  2210. static int
  2211.  wsrch (w, low, high)
  2212.   char *w;
  2213.   int low, high;
  2214. {
  2215.   int i, j;
  2216.  
  2217.   for (;;)
  2218.   {
  2219.     i = (low + high) / 2;
  2220.     if ((j = strncmp (w, Wp[i], 4)) == 0)
  2221.       return i;            /* Found it */
  2222.     if (high == low + 1)
  2223.     {
  2224.       /* Avoid effects of integer truncation in /2 */
  2225.       if (strncmp (w, Wp[high], 4) == 0)
  2226.     return high;
  2227.       else
  2228.     return -1;
  2229.     }
  2230.     if (low >= high)
  2231.       return -1;        /* I don't *think* this can happen... */
  2232.     if (j < 0)
  2233.       high = i;            /* Search lower half */
  2234.     else
  2235.       low = i;            /* Search upper half */
  2236.   }
  2237. }
  2238. static void
  2239.  insert (s, x, start, length)
  2240.   char *s;
  2241.   int x;
  2242.   int start, length;
  2243. {
  2244.   unsigned char cl;
  2245.   unsigned char cc;
  2246.   unsigned char cr;
  2247.   unsigned long y;
  2248.   int shift;
  2249.  
  2250.   assert (length <= 11);
  2251.   assert (start >= 0);
  2252.   assert (length >= 0);
  2253.   assert (start + length <= 66);
  2254.  
  2255.   shift = ((8 - ((start + length) % 8)) % 8);
  2256.   y = (long) x << shift;
  2257.   cl = (y >> 16) & 0xff;
  2258.   cc = (y >> 8) & 0xff;
  2259.   cr = y & 0xff;
  2260.   if (shift + length > 16)
  2261.   {
  2262.     s[start / 8] |= cl;
  2263.     s[start / 8 + 1] |= cc;
  2264.     s[start / 8 + 2] |= cr;
  2265.   }
  2266.   else if (shift + length > 8)
  2267.   {
  2268.     s[start / 8] |= cc;
  2269.     s[start / 8 + 1] |= cr;
  2270.   }
  2271.   else
  2272.   {
  2273.     s[start / 8] |= cr;
  2274.   }
  2275. }
  2276.  
  2277. static void
  2278.  standard (word)
  2279.   register char *word;
  2280. {
  2281.   while (*word)
  2282.   {
  2283.     if (!isascii (*word))
  2284.       break;
  2285.     if (islower (*word))
  2286.       *word = toupper (*word);
  2287.     if (*word == '1')
  2288.       *word = 'L';
  2289.     if (*word == '0')
  2290.       *word = 'O';
  2291.     if (*word == '5')
  2292.       *word = 'S';
  2293.     word++;
  2294.   }
  2295. }
  2296.  
  2297. /* Extract 'length' bits from the char array 's' starting with bit 'start' */
  2298. static unsigned long
  2299.  extract (s, start, length)
  2300.   char *s;
  2301.   int start, length;
  2302. {
  2303.   unsigned char cl;
  2304.   unsigned char cc;
  2305.   unsigned char cr;
  2306.   unsigned long x;
  2307.  
  2308.   assert (length <= 11);
  2309.   assert (start >= 0);
  2310.   assert (length >= 0);
  2311.   assert (start + length <= 66);
  2312.  
  2313.   cl = s[start / 8];
  2314.   cc = s[start / 8 + 1];
  2315.   cr = s[start / 8 + 2];
  2316.   x = ((long) (cl << 8 | cc) << 8 | cr);
  2317.   x = x >> (24 - (length + (start % 8)));
  2318.   x = (x & (0xffff >> (16 - length)));
  2319.   return (x);
  2320. }
  2321.